package com.java.dao;

import com.java.bean.Express;
import com.java.exception.DuplicateCodeException;

import java.util.List;
import java.util.Map;

public interface BaseExpressDao {

    /**
     * 获取控制台所需的快递数据
     *
     * @return [{size:XXX,day:XXX},{size:XXX,day:XXX}]
     */
    List<Map<String, Integer>> console();

    /**
     * 获取快件分布图所需的快递数据
     *
     * @return [{name:XXX,value:XXX},{name:XXX,value:XXX}]
     */
    List<Map<String, Object>> map();

    /**
     * 查找快件
     *
     * @param limit    是否分页 true 是(默认）， false 查询所有
     * @param offset   起始索引
     * @param pageSize 获取的快递数量, 即使不分页，该参数也限制查询数量
     * @return 快递列表
     */
    List<Express> listExpress(boolean limit, int offset, int pageSize);

    /**
     * 根据单号查询快递信息
     *
     * @param number 单号
     * @return 快递信息
     */
    Express getExpressByNumber(String number);

    /**
     * 根据取件码查询快递信息
     *
     * @param code 取件码
     * @return 快递信息
     */
    Express getExpressByCode(String code);

    /**
     * 根据用户的手机号，查询快递信息
     *
     * @param userPhone 用户的手机号
     * @return 快递信息
     */
    List<Express> getExpressByUserphone(String userPhone);

    /**
     * 根据用户的手机号，查询快递信息
     *
     * @param userPhone 用户的手机号
     * @param status 状态
     * @return 快递信息
     */
    List<Express> getExpressByUserphoneAndStatus(String userPhone, int status);

    /**
     * 根据录入人的手机号，查询快递信息（快递员/柜子的历史记录）
     *
     * @param cphone 录入人的手机号
     * @return 快递信息
     */
    List<Express> getExpressByCphone(String cphone);

    /**
     * 快件录入
     *
     * @param express 必须要包含：快递单号  快递公司  取件码  收件人 id  快递员 id
     * @return 影响行数
     */
    int insert(Express express) throws DuplicateCodeException;

    /**
     * 修改快递信息
     *
     * @param id         要修改的快递id
     * @param newExpress 新的快递单号 新的快递公司 新的收货人姓名 新的收件人手机号码 新的快递的状态
     * @return 影响行数
     */
    int update(int id, Express newExpress) throws DuplicateCodeException;

    /**
     * 根据id删除快递信息
     *
     * @param id 要删除的快递id
     * @return 影响行数
     */
    int delete(int id);

    /**
     * 确认取件
     *
     * @param number 快递单号
     * @return 影响行数
     */
    int updateState(String code);

    /**
     * 根据 id 查询快递信息
     *
     * @param id 单号
     * @return 快递信息
     */
    Express getExpressById(int id);

    /**
     * 根据电话号码的快递量按降序获取电话号码的集合
     *
     * @return 电话号码的集合
     */
    List<Object[]> getExpressRankByPhoneRangeOfIntime(String timeFrom, String timeTo);
}
